/**
 * Schema：一种以文件形式存储的数据库模型骨架，不具备数据库的操作能力
 * Model：由Schema发布生成的模型，具有抽象属性和行为的数据库操作对
 * Entity：由Model创建的实体，他的操作也会影响数据库
 * 
 * Schema、Model、Entity的关系请牢记：
 * Schema生成Model，Model创造Entity，
 * Model和Entity都可对数据库操作造成影响，但Model比Entity更具操作性
 */

const mongoose = require('mongoose')
const db = require('../utils/db')

// 定义user的Schema，用户信息的数据模型
const userSchema = new mongoose.Schema({
	name: String,	//姓名
	age: Number,	//年龄
	sex: String		//性别
})

// 将Schema发布为Model
const userModel = db.model('user', userSchema)

// 封装方法
module.exports = {
	//添加用户
	save(data) {
		return new Promise((resolve, reject) => {
			/**
			 * 这里区分save() 与 create()方法
			 * save() 是userModel的实例方法
			 * create() 是userModel的静态方法
			 */

			//方式一
			// userModel.create(data, (err, docs) => {
			// 	if (err) {
			// 		reject(err)
			// 	} else {
			// 		resolve(docs)
			// 	}
			// })

			//方式二
			//用Model创建userEntity
			let userEntity = new userModel(data)
			userEntity.save((err, docs) => {
				if (err) {
					reject(err)
				} else {
					resolve(docs)
				}
			})
		})
	},
	find(data = {}, fields = null, options = {}) {
		return new Promise((resolve, reject) => {
			userModel.find(data, fields, options, (error, doc) => {
				if (error) {
					reject(error)
				} else {
					resolve(doc)
				}
			})
		})
	},
	findOne(data) {
		return new Promise((resolve, reject) => {
			userModel.findOne(data, (error, doc) => {
				if (error) {
					reject(error)
				} else {
					resolve(doc)
				}
			})
		})
	},
	findById(data) {
		return new Promise((resolve, reject) => {
			//model.findById(需要查找的id对象 ,callback)
			userModel.findById(data, (error, doc) => {
				if (error) {
					reject(error)
				} else {
					resolve(doc)
				}
			})
		})
	},
	update(conditions, update) {
		return new Promise((resolve, reject) => {
			//model.update(查询条件,更新对象,callback)
			userModel.update(conditions, update, (error, doc) => {
				if (error) {
					reject(error)
				} else {
					resolve(doc)
				}
			})
		})
	},
	remove(conditions) {
		return new Promise((resolve, reject) => {
			//model.update(查询条件,callback)
			userModel.remove(conditions, (error, doc) => {
				if (error) {
					reject(error)
				} else {
					resolve(doc)
				}
			})
		})
	}
}
